/*
 *  Лицензия MIT
 * 
 *  Copyright 2011 Salnikov Aleksey.
 * 
 *  Данная лицензия разрешает, безвозмездно, лицам, получившим копию данного программного обеспечения
 *  и сопутствующей документации (в дальнейшем именуемыми "Программное Обеспечение"),
 *  использовать Программное Обеспечение без ограничений, включая неограниченное право
 *  на использование, копирование, изменение, объединение, публикацию, распространение,
 *  сублицензирование и/или продажу копий Программного Обеспечения, также как и лицам,
 *  которым предоставляется данное Программное Обеспечение, при соблюдении следующих условий:
 * 
 *  Вышеупомянутый копирайт и данные условия должны быть включены во все копии или значимые
 *  части данного Программного Обеспечения.
 * 
 *  ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ ЛЮБОГО ВИДА ГАРАНТИЙ,
 *  ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ,
 *  СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И НЕНАРУШЕНИЯ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ
 *  НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ ИЛИ ДРУГИХ ТРЕБОВАНИЙ
 *  ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ ПРИЧИНОЙ ИЛИ СВЯЗАННЫМ
 *  С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
 *  ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
 */

package CommonTools;

import Interfaces.AdminInterface;
import database.Db;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 *
 * @author Salnikov Aleksey
 */
public class AdminImpl extends UnicastRemoteObject implements AdminInterface {

    protected Db db = new Db();

    public AdminImpl() throws RemoteException
    {}

    public Admin authenticate(String login, String password) throws RemoteException
    {
        Admin admin = null;
        try {
            admin = db.getAdminByLoginAndPassword(login, password);
        } catch (SQLException ex) {
            //Logger.getLogger(AdminImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return admin;
    }

    public ArrayList<Demand> getAllDemands() throws RemoteException {
        try {
            return db.getAllDemand(false);
        } catch (SQLException ex) {
            return null;
        }
    }

    public ArrayList<Admin> getAllAdmins() throws RemoteException {
        try {
            return db.getAdmins();
        } catch (SQLException ex) {
            return null;
        }
    }

    public void deleteDemand(int id) throws RemoteException
    {
        db.deleteDemand(id);
    }

    public void addAdmin(String name, String fam, String otch, String login, String password, int root, String mail, String phone) throws RemoteException {
        db.addAdmin(name, fam, otch, login, password, root, mail, phone);
    }

    /**
     * Функция удаления администратора
     * @param id номер администратора из БД
     */
    public void deleteAdmin(int id) throws RemoteException
    {
        db.deleteAdmin(id);
    }

    public void editAdmin(int id, String name, String fam, String otch, String login, String password, int root, String mail, String phone) throws RemoteException {
        db.editAdmin(id, name, fam, otch, login, password, root, mail, phone);
    }

    public void editDemand(int idDemand, int idAdmin, String comment, String status) throws RemoteException {
        db.editDemand(idDemand, idAdmin, comment, status);
    }

    public void executeDemand(int idDemand, int idAdmin) throws RemoteException {
        db.executeDemand(idDemand, idAdmin);
    }

    /**
     * Функция получения списка заявок с учетом фильтра пользователя
     * @param staus int - статус заявки. Выбирается из класса Constants,
     * и может принимать значения:
     * ALL_DEMANDS - все заявки
     * EXECUTE_DEMANDS - только выполненные заявки
     * NOT_EXECUTE_DEMANDS - только не выполненные заявки
     * @param time int - время поступления заявки. Выбирается из класса Constants
     * и может принимать значения:
     * ALL_TIME_DEMANDS - заявки за все время
     * LAST_WEEK_DEMANDS - заявки за последнюю неделю
     * PERIOD_TIME_DEMANDS - заявки за период времени. Если используется этот параметр, то
     * можно воспользоваться функцией getDemandsByTime()
     * @param admin int - уникальный номер администратора
     * @return ArrayList<Demand> - список заявок, удовлетворяющих условиям
     * @throws RemoteException
     */
    public ArrayList<Demand> getDemandsByFilter(int staus, int time, int admin, String pc) throws RemoteException
    {
        try {
            return db.getDemandsByFilter(staus, time, admin, pc);
        } catch (SQLException ex) {
            return null;
        }
    }

    public int getStatistic() throws RemoteException
    {
        return db.getStaticstic();
    }

    public boolean isAdminThere(String login) throws RemoteException
    {
        return db.isThere(login);
    }

    /**
     * Функция для возвращения всех компьютеров, от которых поступали заявки
     * @return Vector
     * @throws RemoteException
     */
    public Vector getComputers() throws RemoteException
    {
        return db.getComputers();
    }

    public String getAutoDeletePeriod() throws RemoteException
    {
        return db.getSystemPropertyValue("autodelete");
    }

    public void setAutoDeletePeriod(String period) throws RemoteException
    {
        db.changeSystemPropertyValue("autodelete", period);
    }

    public void autoDelete() throws RemoteException
    {
        db.autoDeleteDemands();
    }

}
